package com.tencent.sr.iris.activity.service.activity;

import com.tencent.sr.iris.activity.common.enums.TaskBatchDateIsParticipatedEnum;
import com.tencent.sr.iris.activity.common.enums.UserTaskStatusEnum;
import com.tencent.sr.iris.activity.interfaces.request.acticity.*;
import com.tencent.sr.iris.activity.interfaces.response.activity.*;
import com.tencent.sr.iris.activity.interfaces.response.group.task.TaskCommissionDetailResponse;
import com.tencent.sr.iris.activity.repository.entity.TIrisActivityAwardRecordDO;
import com.tencent.sr.iris.activity.repository.entity.TIrisUserTaskRecordDO;
import com.tencent.sr.rmall.common.primitive.HttpResult;
import com.tencent.sr.rmall.common.request.PaginationRequest;
import com.tencent.sr.rmall.common.response.PaginationResponse;
import org.springframework.data.util.Pair;

import java.util.Date;
import java.util.List;

public interface IrisUserTaskRecordService {

    /**
     * 搜索es数据
     *
     * @param request
     * @return
     */
    PaginationResponse<UserTaskRecordResponse> userTaskPage(PaginationRequest<UserTaskRecordRequest> request);

    /**
     * 获取下级任务参与记录详情
     * @param request request
     * @return UserTaskRecordResponse
     */
    PaginationResponse<UserTaskRecordResponse> getJuniorTaskRecordList(PaginationRequest<GetJuniorTaskRecordListRequest> request);

    /**
     * 查询uid已使用邀请限额
     *
     * @param uid
     * @param monthStr
     * @return
     */
    long queryContributedUserCount(String uid, String monthStr);

    /**
     * 统计pid下的uid数
     *
     * @param request
     * @return
     */
    long countDistinctUid(ActivityUserStaticRequest request);

    /**
     * 搜索db数据
     *
     * @param request
     * @return
     */
    PaginationResponse<UserTaskRecordResponse> userTaskPageDb(
            PaginationRequest<QueryUserTaskRecordPageRequest> request);

    /**
     * 查询用户活动任务完成进度，会查询出已删除的记录
     *
     * @param request
     * @return
     */
    TIrisUserTaskRecordDO queryUserTaskRecord(QueryUserTaskRecordFromDBRequest request);

    /**
     * 查询活动的任务记录
     * @param uid
     * @param activityId
     * @param period
     * @return
     */
    List<TIrisUserTaskRecordDO> queryActivityTaskRecords(String uid, String activityId, String period);

    int updateTaskRecordActivityRecordId(String uid, String activityId, String period, String taskId, String activityRecordId);

    /**
     * 更新任务进度，如果此时任务记录是已删除，会把任务状态更新成正常
     */
    void updateUserTaskRecordStatus(TIrisUserTaskRecordDO userTaskRecordDO,
            TIrisActivityAwardRecordDO awardRecordDO);

    /**
     * 删除任务记录
     * @param userTaskRecordDO
     */
    void deleteTaskRecord(TIrisUserTaskRecordDO userTaskRecordDO);

    /**
     * 更新任务时间
     *
     * @param userTaskRecord
     */
    void updateUserTaskStartTime(TIrisUserTaskRecordDO userTaskRecord);

    /**
     * 插入用户任务进度记录
     *
     * @param userTaskRecordDO
     */
    void saveUserTaskRecord(TIrisUserTaskRecordDO userTaskRecordDO);

    /**
     * 长期激励统计
     *
     * @param request
     * @return
     */
    LongTermAwardStaticResponse longTermAwardStatic(LongTermAwardStaticRequest request);

    /**
     * 活动收益统计
     *
     * @param request
     * @return
     */
    AwardStaticResponse awardStatic(AwardStaticRequest request);

    /**
     * 获取待确认收益任务详情
     *
     * @param request
     * @return
     */
    List<TaskCommissionDetailResponse> getWaitTaskPhaseData(TaskRecordRequest request);

    /**
     * 更新任务参与记录（工具平台使用，其它业务禁用）
     *
     * @param request
     * @return
     */
    @Deprecated
    Boolean updateUserTaskRecord(UpdateUserTaskRecordRequest request);

    /**
     * 活动参与用户统计
     *
     * @param request
     * @return
     */
    ActivityUserStaticResponse activityUserStatic(ActivityUserStaticRequest request);

    /**
     * 用户活动信息
     * @param request
     * @return
     */
    UserActivityInfoResponse userActivityInfo(UserActivityInfoRequest request);

    /**
     * 所有活动统计
     * @param request
     * @return
     */
    ActivityStaticResponse activityStatic(ActivityStaticRequest request);

    /**
     * 删除进行中的用户进度（只删除实际状态进行中，且预估状态进行中的任务）（软删除）
     *
     * @param uid
     * @param actBizId
     * @param taskBizId
     */
    int deleteInProgressTaskRecord(String uid, String actBizId, String taskBizId);

    /**
     * 补刷pid
     *
     * @param pageSize
     */
    List<String> updateTaskRecordPid(int pageSize);

    /**
     * 刷gmv
     *
     * @param pageSize
     * @param shardingId
     * @return
     */
    boolean updateTaskRecordGmv(int pageSize, Integer shardingId);

    /**
     * 查询该用户在Date所在月邀请了多少下级
     *
     * @param pid
     * @param date
     * @return
     */
    Pair<Integer, Integer> queryInviteLimitSeqByPid(String pid, Date date);

    /**
     * 删除邀请上限数量记录缓存
     *
     * @param pid
     * @param uid
     */
    void deleteInviteLimitCache(String pid, String uid);

    /**
     * 递增邀请上限数量记录缓存
     *
     * @param pid
     * @param uid
     */
    void incrInviteLimitCache(String pid, String uid, String isParticipated);

    /**
     * 根据pid查询邀请有礼下级uid（es查询）
     * @param pid
     * @param month
     * @param statusList
     * @return
     */
    List<String> queryInviteTaskRecordByPid(String pid, Date month, List<Byte> statusList);

    /**
     * 跟进pid查询邀请有礼下级任务进度列表（es查询）
     * @param pid
     * @param month
     * @param statusList
     * @return
     */
    List<TIrisUserTaskRecordDO> queryUserTaskRecordDOSByPidEs(String pid, Date month, List<Byte> statusList);

    /**
     * pid调整发奖上限，处理pid下级的限额情况
     * @param request
     */
    HttpResult<String> processUpdateLimit(ProcessUpdateLimitRequest request);

    /**
     * 更新邀请有礼任务限制状态
     * @param uidList
     * @param isParticipated
     * @param userTaskStatusEnum
     */
    void updateUserTaskRecordIsParticipated(List<String> uidList, TaskBatchDateIsParticipatedEnum isParticipated,
            UserTaskStatusEnum userTaskStatusEnum);

    /**
     * 查询余额流水活动信息
     * @param request
     * @return
     */
    FlowActivityInfoResponse queryFlowActivityInfo(FlowActivityInfoRequest request);

    /**
     * 根据pid查询任务记录表在见习所在月的派奖成功/失败uid数量
     * @param pid
     * @param date
     * @return
     */
    Integer queryAwardTotalByPid(String pid, Date date);
}
